package com.gyj.user.config;


/*
@Configuration
public class RedisConfiguration {

    */
/**
     StringRedisSerializer和Jackson2JsonRedisSerializer都是系统提供的已实现的序列化方式。
     StringXX是转为String，JacksonXX是将对象转为json。需要注意这里Key使用了StringRedisSerializer，
     那么Key只能是String类型的，不能为Long，Integer，否则会报错抛异常。
     *//*

    //这种获取redis的方式也是可以的
    */
/*@Bean
    @SuppressWarnings({"rawtypes", "unchecked"})
    public RedisTemplate<String, String> redisTemplate(RedisConnectionFactory redisFactory) {
        StringRedisTemplate template = new StringRedisTemplate(redisFactory);
        Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);

        ObjectMapper om = new ObjectMapper();
        om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
        om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
        jackson2JsonRedisSerializer.setObjectMapper(om);

        template.setValueSerializer(jackson2JsonRedisSerializer);
        template.afterPropertiesSet();

        return template;
    }*//*


    @Bean(name = "springSessionDefaultRedisSerializer")
    public GenericJackson2JsonRedisSerializer getGenericJackson2JsonRedisSerializer() {
        return new GenericJackson2JsonRedisSerializer();
    }

    @Bean
    public RedisTemplate<String, Object> getRedisTemplate(JedisConnectionFactory connectionFactory) {
        RedisTemplate<String, Object> redisTemplate = new RedisTemplate<String, Object>();
        redisTemplate.setConnectionFactory(connectionFactory);
        redisTemplate.setDefaultSerializer(new GenericJackson2JsonRedisSerializer());
        StringRedisSerializer stringRedisSerializer = new StringRedisSerializer();
        redisTemplate.setKeySerializer(stringRedisSerializer);
        redisTemplate.setHashKeySerializer(stringRedisSerializer);

        return redisTemplate;
    }
}
*/

/**
 * spring-data-redis的序列化类有下面这几个:
 GenericToStringSerializer: 可以将任何对象泛化为字符串并序列化
 Jackson2JsonRedisSerializer: 跟JacksonJsonRedisSerializer实际上是一样的
 JacksonJsonRedisSerializer: 序列化object对象为json字符串
 JdkSerializationRedisSerializer: 序列化java对象
 StringRedisSerializer: 简单的字符串序列化

 1，使用JdkSerializationRedisSerializer序列化
 用JdkSerializationRedisSerializer序列化的话，被序列化的对象必须实现Serializable接口
 JdkSerializationRedisSerializer. 使用JDK提供的序列化功能。 优点是反序列化时不需要提供类型信息(class)，但缺点是序列化后的结果非常庞大，
 是JSON格式的5倍左右，这样就会消耗redis服务器的大量内存。

 2，使用JacksonJsonRedisSerializer序列化
 如果需要保存对象为json的话推荐使用JacksonJsonRedisSerializer，它不仅可以将对象序列化，
 还可以将对象转换为json字符串并保存到redis中，但需要和jackson配合一起使用。而且被序列化的对象不用实现Serializable接口。
 Jackson2JsonRedisSerializer. 使用Jackson库将对象序列化为JSON字符串。优点是速度快，序列化后的字符串短小精悍。但缺点也非常致命，
 那就是此类的构造函数中有一个类型参数，必须提供要序列化对象的类型信息(.class对象)。 通过查看源代码，发现其只在反序列化过程中用到了类型信息

 3.JacksonJsonRedisSerializer和GenericJackson2JsonRedisSerializer，两者都能系列化成json，但是后者会在json中加入@class属性，类的全路径包名，
 。前者如果存放了List则在反系列化的时候如果没指定TypeReference则会报错java.util.LinkedHashMap cannot be cast to
 */
